גלו את עולם מערכות ה-CMS Headless, עם דגש על טכניקות אינטגרציה בצד הלקוח באמצעות API. למדו כיצד לבנות חוויות רשת דינמיות ומרתקות.
ניהול תוכן בצד הלקוח: אינטגרציה עם מערכות CMS Headless ו-API
בנוף הדיגיטלי המתפתח במהירות של ימינו, עסקים צריכים לספק חוויות משתמש יוצאות דופן על פני פלטפורמות שונות. מערכת ניהול תוכן (CMS) מסורתית ומונוליטית עלולה להפוך לעיתים קרובות לצוואר בקבוק, ולפגוע בגמישות ובביצועים. כאן נכנסת לתמונה מערכת CMS Headless. פוסט זה יצלול לעולם ניהול התוכן בצד הלקוח באמצעות פתרונות CMS Headless ו-API, ויחקור את יתרונותיהם, טכניקות האינטגרציה ודוגמאות מעשיות.
מהי מערכת CMS Headless?
מערכת CMS Headless, בניגוד למקבילתה המסורתית, מפרידה את מאגר התוכן (ה-"גוף") משכבת התצוגה (ה-"ראש"). משמעות הדבר היא שה-CMS מתמקד אך ורק באחסון, ניהול ואספקת תוכן באמצעות API, מבלי להכתיב כיצד או היכן תוכן זה יוצג. צד הלקוח, או ה-"ראש", חופשי לצרוך את התוכן הזה ולהציגו בכל פורמט רצוי, בין אם זה אתר אינטרנט, אפליקציית מובייל, מכשיר IoT או כל ערוץ דיגיטלי אחר.
מאפיינים מרכזיים של CMS Headless:
- ארכיטקטורת API-First: הגישה לתוכן ואספקתו מתבצעות דרך ממשקי API מסוג RESTful או GraphQL.
- תוכן כנתונים: התוכן מטופל כנתונים מובנים, מה שמקל על שימוש חוזר והפצה שלו על פני ערוצים מרובים.
- אגנוסטיות לצד הלקוח: מפתחים יכולים להשתמש בכל טכנולוגיית צד לקוח (React, Vue.js, Angular וכו') כדי לבנות את שכבת התצוגה.
- סקיילביליות וביצועים: ארכיטקטורה מבוזרת מאפשרת масштабирование (סקיילינג) עצמאי של צד השרת וצד הלקוח, מה שמוביל לשיפור בביצועים ובעמידות.
היתרונות בשימוש ב-CMS Headless
אימוץ CMS Headless מציע יתרונות רבים לעסקים ולמפתחים:
- גמישות משופרת: בחרו את טכנולוגיית צד הלקוח המתאימה ביותר לצרכים שלכם, מבלי להיות מוגבלים על ידי מגבלות ה-CMS. זה מאפשר חדשנות רבה יותר ויצירת חוויות משתמש ייחודיות. דמיינו חברת מסחר אלקטרוני גלובלית שרוצה ליצור חווית קנייה אינטראקטיבית במיוחד עם אנימציות מותאמות אישית. CMS Headless מאפשר להם להשתמש בסביבת עבודה מודרנית של JavaScript כמו React כדי לבנות חוויה זו מבלי להיות מוגבלים על ידי תבניות של CMS מסורתי.
- ביצועים משופרים: פתרונות CMS Headless משתלבים היטב עם רשתות אספקת תוכן (CDNs) ומחוללי אתרים סטטיים, מה שמוביל לזמני טעינה מהירים יותר ולשיפור ב-SEO. ארגון חדשות המגיש תוכן לקהל גלובלי יכול למנף CDN כדי לשמור תוכן במטמון קרוב יותר למשתמשים, ובכך להפחית באופן דרסטי את זמן ההשהיה.
- אספקת תוכן רב-ערוצית: ספקו תוכן בקלות לערוצים שונים, כולל אתרי אינטרנט, אפליקציות מובייל, מכשירים חכמים ועוד. תאגיד רב-לאומי יכול להשתמש ב-CMS Headless יחיד כדי לנהל תוכן עבור האתר, אפליקציית המובייל והקיוסקים בחנויות, תוך הבטחת עקביות בכל נקודות המגע.
- אבטחה מוגברת: ארכיטקטורה מבוזרת מפחיתה את שטח התקיפה, מה שהופך את המערכת למאובטחת יותר. על ידי הפרדת מאגר התוכן משכבת התצוגה, פגיעויות פוטנציאליות בצד הלקוח נוטות פחות לסכן את המערכת כולה.
- העצמת מפתחים: למפתחים יש יותר שליטה על צד הלקוח והם יכולים להשתמש בכלים ובזרימות העבודה המועדפים עליהם. הם כבר לא מוגבלים על ידי מערכת התבניות או האקוסיסטם של התוספים של ה-CMS.
- עמידות לעתיד (Future-Proofing): ארכיטקטורות CMS Headless ניתנות להתאמה טובה יותר לטכנולוגיות ומגמות עתידיות. ככל שערוצים ומכשירים חדשים צצים, ניתן לשלב אותם בקלות באסטרטגיית אספקת התוכן שלכם.
פתרונות CMS Headless נפוצים
השוק מציע מגוון רחב של פתרונות CMS Headless, כל אחד עם חוזקותיו וחולשותיו. הנה כמה אפשרויות פופולריות:
- Contentful: CMS Headless פופולרי ועשיר בתכונות עם דגש חזק על מידול תוכן וגמישות API.
- Sanity: פלטפורמת תוכן בזמן אמת עם מאגר נתונים חזק וממשק עריכה הניתן להתאמה אישית.
- Strapi: CMS Headless בקוד פתוח הניתן להתאמה אישית גבוהה ומאפשר למפתחים לבנות API משלהם.
- Netlify CMS: CMS מבוסס Git בקוד פתוח, אידיאלי עבור מחוללי אתרים סטטיים כמו Gatsby ו-Hugo.
- Directus: אפשרות קוד פתוח נוספת שהופכת באופן מיידי כל מסד נתונים SQL ל-API ולאפליקציית ניהול ללא קוד.
- ButterCMS: CMS Headless ממוקד שיווק שתוכנן לנוחות שימוש ואינטגרציה עם אתרים קיימים.
בעת בחירת CMS Headless, שקלו את הצרכים הספציפיים שלכם, המומחיות הטכנית והתקציב.
טכניקות אינטגרציה בצד הלקוח עם APIs
ליבת האינטגרציה של צד הלקוח עם CMS Headless טמונה בצריכת תוכן דרך APIs. להלן פירוט של טכניקות נפוצות:
1. ממשקי API מסוג RESTful
ממשקי API מסוג RESTful הם תקן נפוץ לגישה למשאבי אינטרנט. הם משתמשים במתודות HTTP (GET, POST, PUT, DELETE) לביצוע פעולות על נתונים. רוב פתרונות ה-CMS Headless מספקים ממשקי API מסוג RESTful לשליפה וניהול של תוכן.
דוגמה: שליפת תוכן עם JavaScript (באמצעות Fetch API)
דוגמה זו מדגימה כיצד לשלוף תוכן מ-Contentful CMS באמצעות ה-REST API שלו:
const spaceId = 'YOUR_SPACE_ID';
const environmentId = 'YOUR_ENVIRONMENT_ID';
const accessToken = 'YOUR_ACCESS_TOKEN';
const entryId = 'YOUR_ENTRY_ID';
const apiUrl = `https://cdn.contentful.com/spaces/${spaceId}/environments/${environmentId}/entries/${entryId}?access_token=${accessToken}`;
fetch(apiUrl)
.then(response => response.json())
.then(data => {
console.log(data);
// Process and render the content
})
.catch(error => {
console.error('Error fetching data:', error);
});
הסבר:
- החליפו את `YOUR_SPACE_ID`, `YOUR_ENVIRONMENT_ID`, `YOUR_ACCESS_TOKEN`, ו-`YOUR_ENTRY_ID` בפרטי הגישה האמיתיים שלכם ל-Contentful.
- פונקציית `fetch()` מבצעת בקשת HTTP GET לנקודת הקצה של ה-API של Contentful.
- המתודה `response.json()` מנתחת את תגובת ה-JSON.
- האובייקט `data` מכיל את התוכן שנשלף מה-CMS.
- טיפול בשגיאות כלול כדי לתפוס בעיות פוטנציאליות במהלך בקשת ה-API.
2. ממשקי API מסוג GraphQL
GraphQL היא שפת שאילתות עבור ממשקי API המאפשרת ללקוחות לבקש שדות נתונים ספציפיים, מה שמפחית שליפת-יתר (over-fetching) ומשפר את הביצועים. חלק מפתרונות ה-CMS Headless, כמו Sanity, מציעים ממשקי GraphQL API לצד ממשקי RESTful API.
דוגמה: שליפת תוכן עם GraphQL (באמצעות GraphQL Client)
דוגמה זו מדגימה כיצד לשלוף תוכן מ-Sanity CMS באמצעות ה-GraphQL API שלו וספריית לקוח GraphQL (למשל, `graphql-request`):
import { GraphQLClient, gql } from 'graphql-request';
const projectId = 'YOUR_PROJECT_ID';
const dataset = 'YOUR_DATASET';
const apiVersion = 'v2021-03-25';
const token = 'YOUR_SANITY_TOKEN'; // Optional: Required for mutations or private datasets
const endpoint = `https://${projectId}.api.sanity.io/${apiVersion}/graphql/${dataset}`;
const client = new GraphQLClient(endpoint, {headers: {Authorization: `Bearer ${token}`}});
const query = gql`
{
allBlog {
_id
title
slug {
current
}
body {
children {
text
}
}
}
}
`;
client.request(query)
.then(data => {
console.log(data);
// Process and render the content
})
.catch(error => {
console.error('Error fetching data:', error);
});
הסבר:
- החליפו את `YOUR_PROJECT_ID`, `YOUR_DATASET`, ו-`YOUR_SANITY_TOKEN` בפרטי הגישה של פרויקט ה-Sanity שלכם. הטוקן הוא לעיתים קרובות אופציונלי עבור מאגרי נתונים ציבוריים אך נדרש עבור שינויים או נתונים פרטיים.
- ה-`GraphQLClient` מאותחל עם נקודת הקצה של ה-API של Sanity וכותרות אימות.
- המשתנה `query` מגדיר את שאילתת ה-GraphQL לשליפת כל הבלוגים עם ה-ID, הכותרת, ה-slug והגוף שלהם.
- המתודה `client.request()` מבצעת את השאילתה ומחזירה את הנתונים.
GraphQL מאפשר לכם לציין בדיוק אילו שדות אתם צריכים, מה שמוביל לשליפת נתונים יעילה יותר בהשוואה ל-REST.
3. שימוש ב-SDKs (ערכות פיתוח תוכנה)
ספקי CMS Headless רבים מציעים SDKs עבור שפות תכנות וסביבות עבודה שונות. SDKs אלו מספקים פונקציות ומתודות מוכנות מראש לאינטראקציה עם ה-API של ה-CMS, מה שמפשט את תהליך הפיתוח.
דוגמה: שימוש ב-SDK של Contentful ל-JavaScript
const contentful = require('contentful');
const client = contentful.createClient({
space: 'YOUR_SPACE_ID',
environment: 'YOUR_ENVIRONMENT_ID',
accessToken: 'YOUR_ACCESS_TOKEN'
});
client.getEntry('YOUR_ENTRY_ID')
.then(entry => {
console.log(entry);
// Process and render the content
})
.catch(error => {
console.error('Error fetching data:', error);
});
הסבר:
- החליפו את `YOUR_SPACE_ID`, `YOUR_ENVIRONMENT_ID`, `YOUR_ACCESS_TOKEN`, ו-`YOUR_ENTRY_ID` בפרטי הגישה שלכם ל-Contentful.
- המתודה `contentful.createClient()` מאתחלת את הלקוח של Contentful עם פרטי ה-API שלכם.
- המתודה `client.getEntry()` שולפת רשומה ספציפית לפי ה-ID שלה.
SDKs מציעים לעיתים קרובות תכונות נוספות כמו תצוגה מקדימה של תוכן, שמירה במטמון וטיפול בשגיאות, מה שהופך אותם לכלי בעל ערך לאינטגרציה בצד הלקוח.
אינטגרציה עם סביבות עבודה (Frameworks) בצד הלקוח
שילוב של CMS Headless עם סביבת עבודה בצד הלקוח כמו React, Vue.js או Angular כרוך בשליפת תוכן מה-API והצגתו בתוך הקומפוננטות של סביבת העבודה.
1. React
React היא ספריית JavaScript פופולרית לבניית ממשקי משתמש. הארכיטקטורה מבוססת הקומפוננטות שלה הופכת אותה למתאימה במיוחד לעבודה עם פתרונות CMS Headless.
דוגמה: קומפוננטת React השולפת תוכן מ-Contentful
import React, { useState, useEffect } from 'react';
const spaceId = 'YOUR_SPACE_ID';
const environmentId = 'YOUR_ENVIRONMENT_ID';
const accessToken = 'YOUR_ACCESS_TOKEN';
const entryId = 'YOUR_ENTRY_ID';
const apiUrl = `https://cdn.contentful.com/spaces/${spaceId}/environments/${environmentId}/entries/${entryId}?access_token=${accessToken}`;
function BlogPost() {
const [blogPost, setBlogPost] = useState(null);
useEffect(() => {
fetch(apiUrl)
.then(response => response.json())
.then(data => {
setBlogPost(data);
})
.catch(error => {
console.error('Error fetching data:', error);
});
}, []);
if (!blogPost) {
return Loading...
;
}
return (
{blogPost.fields.title}
{blogPost.fields.body}
);
}
export default BlogPost;
הסבר:
- ה-hook `useState` משמש לניהול נתוני הפוסט בבלוג.
- ה-hook `useEffect` שולף את התוכן מה-API של Contentful כאשר הקומפוננטה נטענת.
- הקומפוננטה מציגה את כותרת וגוף הפוסט בבלוג על סמך הנתונים שנשלפו מה-API.
2. Vue.js
Vue.js היא סביבת עבודה פופולרית נוספת של JavaScript לבניית ממשקי משתמש. היא ידועה בפשטותה ובקלות השימוש בה.
דוגמה: קומפוננטת Vue.js השולפת תוכן מ-Contentful
{{ blogPost.fields.title }}
{{ blogPost.fields.body }}
הסבר:
- אפשרות `data` משמשת לאחסון נתוני הפוסט בבלוג.
- ה-hook `mounted` במחזור החיים שולף את התוכן מה-API של Contentful כאשר הקומפוננטה נטענת.
- התבנית מציגה את כותרת וגוף הפוסט בבלוג על סמך הנתונים שנשלפו מה-API.
3. Angular
Angular היא סביבת עבודה חזקה, הידועה במבנה האיתן והסקיילביליות שלה.
דוגמה: קומפוננטת Angular השולפת תוכן מ-Contentful
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-blog-post',
templateUrl: './blog-post.component.html',
styleUrls: ['./blog-post.component.css']
})
export class BlogPostComponent implements OnInit {
blogPost: any;
constructor(private http: HttpClient) { }
ngOnInit(): void {
const spaceId = 'YOUR_SPACE_ID';
const environmentId = 'YOUR_ENVIRONMENT_ID';
const accessToken = 'YOUR_ACCESS_TOKEN';
const entryId = 'YOUR_ENTRY_ID';
const apiUrl = `https://cdn.contentful.com/spaces/${spaceId}/environments/${environmentId}/entries/${entryId}?access_token=${accessToken}`;
this.http.get(apiUrl)
.subscribe(data => {
this.blogPost = data;
},
error => {
console.error('Error fetching data:', error);
});
}
}
{{ blogPost?.fields?.title }}
{{ blogPost?.fields?.body }}
הסבר:
- המודול `HttpClient` משמש לביצוע בקשות HTTP.
- ה-hook `ngOnInit` במחזור החיים שולף את התוכן מה-API של Contentful כאשר הקומפוננטה מאותחלת.
- הקומפוננטה מציגה את כותרת וגוף הפוסט בבלוג על סמך הנתונים שנשלפו מה-API.
מחוללי אתרים סטטיים (SSGs) ו-CMS Headless
מחוללי אתרים סטטיים (SSGs) כמו Gatsby, Next.js, ו-Hugo משמשים לעיתים קרובות בשילוב עם פתרונות CMS Headless לבניית אתרים מהירים ומאובטחים. SSGs מעבדים מראש את תוכן האתר בזמן הבנייה, מה שיוצר קובצי HTML סטטיים שניתן להגיש מ-CDN. גישה זו מציעה יתרונות ביצועים משמעותיים בהשוואה לעיבוד מסורתי בצד השרת.
יתרונות השימוש ב-SSGs עם CMS Headless:
- ביצועים משופרים: אתרים סטטיים נטענים הרבה יותר מהר מאתרים דינמיים, מה שמוביל לחוויית משתמש טובה יותר ולשיפור ב-SEO.
- אבטחה משופרת: לאתרים סטטיים יש שטח תקיפה מופחת בהשוואה לאתרים דינמיים, מכיוון שאין מסד נתונים או קוד צד שרת שניתן לנצל.
- פריסה פשוטה: ניתן לפרוס אתרים סטטיים בקלות ל-CDNs או לספקי אירוח סטטי כמו Netlify ו-Vercel.
- סקיילביליות: אתרים סטטיים יכולים להתמודד עם כמות גדולה של תעבורה מבלי לדרוש תשתית שרתים מורכבת.
דוגמה: Gatsby עם Contentful
Gatsby הוא מחולל אתרים סטטי פופולרי מבוסס React המשתלב בצורה חלקה עם Contentful. התוסף `gatsby-source-contentful` מאפשר לכם לשלוף תוכן מ-Contentful בזמן הבנייה ולהשתמש בו ליצירת דפים סטטיים.
שלבים:
- התקינו את התוסף `gatsby-source-contentful`:
npm install gatsby-source-contentful - הגדירו את התוסף ב-`gatsby-config.js`:
module.exports = { plugins: [ { resolve: `gatsby-source-contentful`, options: { spaceId: `YOUR_SPACE_ID`, accessToken: `YOUR_ACCESS_TOKEN`, environment: `YOUR_ENVIRONMENT_ID` }, }, ], }; - שלפו נתוני Contentful באמצעות GraphQL בדפי ה-Gatsby שלכם:
import React from 'react'; import { graphql } from 'gatsby'; export const query = graphql` query BlogPostBySlug( $slug: String! ) { contentfulBlogPost(slug: { eq: $slug }) { title body { json } } } ` const BlogPostTemplate = ({ data }) => { const post = data.contentfulBlogPost return () } export default BlogPostTemplate{post.title}
{post.body.json.content[0].content[0].value}
מידול תוכן (Content Modeling) עבור CMS Headless
מידול תוכן יעיל הוא חיוני ליישום מוצלח של CMS Headless. מודל תוכן מעוצב היטב מבטיח שהתוכן מובנה באופן משמעותי וגמיש, המאפשר שימוש חוזר ואספקה קלה על פני ערוצים מרובים.
שיקולים מרכזיים למידול תוכן:
- זיהוי סוגי תוכן: קבעו את סוגי התוכן השונים שאתם צריכים לנהל (למשל, פוסטים בבלוג, מאמרים, מוצרים, אירועים).
- הגדרת שדות: הגדירו את השדות המרכיבים כל סוג תוכן (למשל, כותרת, גוף, מחבר, תאריך).
- יצירת קשרים: הגדירו את הקשרים בין סוגי תוכן שונים (למשל, פוסט בבלוג יכול להיות משויך למספר קטגוריות).
- שקילת שימוש חוזר בתוכן: עצבו את מודל התוכן שלכם כדי להקל על שימוש חוזר בתוכן על פני ערוצים מרובים.
- חשבו על SEO: שלבו שיטות עבודה מומלצות ל-SEO במודל התוכן שלכם (למשל, שימוש בכותרות תיאוריות ובתיאורי מטא).
דוגמה: מודל תוכן לפוסט בבלוג
- סוג תוכן: פוסט בבלוג
- שדות:
- כותרת (טקסט)
- Slug (טקסט)
- גוף (טקסט עשיר)
- מחבר (הפניה לסוג תוכן מחבר)
- קטגוריה (הפניה לסוג תוכן קטגוריה)
- תמונה ראשית (מדיה)
- תיאור מטא (טקסט)
- תאריך פרסום (תאריך)
שיטות עבודה מומלצות לאינטגרציה עם CMS Headless
כדי להבטיח אינטגרציה חלקה ומוצלחת עם CMS Headless, שקלו את שיטות העבודה המומלצות הבאות:
- תכננו בקפידה את מודל התוכן שלכם: מודל תוכן מוגדר היטב חיוני להצלחה ארוכת טווח.
- בחרו את ה-CMS Headless הנכון: בחרו CMS Headless העונה על הצרכים הספציפיים והמומחיות הטכנית שלכם.
- השתמשו בלקוח API עקבי: השתמשו בספריית לקוח API עקבית או ב-SDK כדי לפשט את האינטראקציות עם ה-API.
- יישמו שמירה במטמון (Caching): יישמו שמירה במטמון כדי לשפר את הביצועים ולהפחית את מספר בקשות ה-API.
- השתמשו ב-CDN: השתמשו ברשת אספקת תוכן (CDN) כדי לספק תוכן במהירות וביעילות למשתמשים ברחבי העולם.
- אוטומציה של פריסות: הפכו את תהליך הפריסה שלכם לאוטומטי כדי להבטיח ששינויים נפרסים במהירות ובאמינות.
- נטרו ביצועים: נטרו את ביצועי האתר או האפליקציה שלכם כדי לזהות ולטפל בכל בעיה. שימו לב במיוחד לזמני תגובת ה-API ולמהירויות אספקת התוכן.
- אבטחו את מפתחות ה-API שלכם: לעולם אל תחשפו את מפתחות ה-API שלכם בקוד צד הלקוח. השתמשו במשתני סביבה ובלוגיקה בצד השרת כדי להגן על פרטי הגישה שלכם.
- יישמו תצוגה מקדימה של תוכן: אפשרו לעורכי תוכן לצפות בשינויים שלהם לפני פרסומם. זה מבטיח שהתוכן מדויק ומושך מבחינה ויזואלית.
- שקלו לוקליזציה: אם אתם מגישים תוכן לקהל גלובלי, יישמו אסטרטגיית לוקליזציה לתרגום תוכן לשפות שונות.
מקרי שימוש (Use Cases) עבור CMS Headless
פתרונות CMS Headless מתאימים למגוון רחב של מקרי שימוש:
- אתרי מסחר אלקטרוני: בניית חוויות מסחר אלקטרוני דינמיות ומותאמות אישית. לדוגמה, קמעונאית אופנה גלובלית יכולה להשתמש ב-CMS Headless לניהול מידע על מוצרים, מבצעים וביקורות לקוחות, ולהעביר תוכן זה לאתר, לאפליקציית המובייל ולערוצי המדיה החברתית שלה.
- אתרי שיווק: יצירת אתרי שיווק מרתקים עם תוכן עשיר ואלמנטים אינטראקטיביים. חברת טכנולוגיה יכולה להשתמש ב-CMS Headless לניהול תוכן האתר שלה, פוסטים בבלוג, מקרי בוחן ווובינרים, ולהעביר תוכן זה לאתר, לדפי נחיתה ולקמפיינים בדוא"ל.
- אפליקציות מובייל: אספקת תוכן לאפליקציות מובייל נייטיב. חברת נסיעות יכולה להשתמש ב-CMS Headless לניהול מדריכי טיולים, מסלולים ומידע על הזמנות, ולהעביר תוכן זה לאפליקציית המובייל שלה עבור iOS ואנדרואיד.
- אפליקציות עמוד יחיד (SPAs): בניית אפליקציות עמוד יחיד מהירות ודינמיות.
- מכשירי IoT: אספקת תוכן למכשירי האינטרנט של הדברים (IoT). חברת בית חכם יכולה להשתמש ב-CMS Headless לניהול תיעוד המכשירים, הדרכות ומידע תמיכה, ולהעביר תוכן זה למכשירי הבית החכם שלה ולאפליקציית המובייל.
- שילוט דיגיטלי: הפעלת תצוגות תוכן דינמיות בחנויות קמעונאיות, מסעדות ומרחבים ציבוריים אחרים.
סיכום
פתרונות CMS Headless מציעים גישה חזקה וגמישה לניהול תוכן, ומעצימים עסקים לספק חוויות משתמש יוצאות דופן על פני ערוצים מרובים. על ידי הפרדת מאגר התוכן משכבת התצוגה ומינוף ממשקי API, מפתחים יכולים לבנות אתרים ואפליקציות דינמיים, בעלי ביצועים גבוהים ומאובטחים. ככל שהנוף הדיגיטלי ממשיך להתפתח, פתרונות CMS Headless ימלאו תפקיד חשוב יותר ויותר ויאפשרו לעסקים להסתגל ולשגשג.